package multiThread;

import java.util.function.IntConsumer;

public class S1195交替打印字符串 {
    /**
     * 多线程的题目基本都是很难读懂
     * 大概是这几个fizz什么的方法，只是为了把Runnable传进去，并不是说要被多次调用
     * 而这个runnable的功能，就是输出那几个单词
     */
    static class FizzBuzz {
        private int n;

        public FizzBuzz(int n) {
            this.n = n;
        }

        // printFizz.run() outputs "fizz".
        public void fizz(Runnable printFizz) throws InterruptedException {

        }

        // printBuzz.run() outputs "buzz".
        public void buzz(Runnable printBuzz) throws InterruptedException {

        }

        // printFizzBuzz.run() outputs "fizzbuzz".
        public void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {

        }

        // printNumber.accept(x) outputs "x", where x is an integer.
        public void number(IntConsumer printNumber) throws InterruptedException {

        }

    }

    /**
     * 看下这个main就知道题目什么意思了，总之是有四个线程分别调用了这几个方法，但是我们需要做的是，不管他们调度情况，输出要是符合要求
     * 也就是说，比如n = 15， 在遍历到1的时候，fizz就不能执行runnable
     */
    public static void main(String[] args) {
        FizzBuzz fizzBuzz = new FizzBuzz(15);
        new Thread(() -> {
            try {
                fizzBuzz.fizz(() -> {
                    System.out.println("fizz");
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                fizzBuzz.buzz(() -> {
                    System.out.println("buzz");
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                fizzBuzz.fizzbuzz(() -> {
                    System.out.println("fizzbuzz");
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                fizzBuzz.number(System.out::println);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

    }
}
